<?php
/**
 *@fileName Utils.php 工具类
 *@FileName Lottery.php   红包活动配置
 *@Author young jy620
 *@version demo1.0.0
 *@Email qq1401504121@live.com
 *@remark 请保留有保留版权信息，我觉得这是我们programmer最基本的道德问题，也是对作者（广大programmer）劳动|成果的一种尊重 向我们伟大programmer致敬
 *@website   www.2tao.com/young (本人近期准备更换工作,个人简历在我的个人网站有介绍,如果你有好的推荐,请与我联系。再次感谢)
 **/
include_once ('Utils.php');
class wxUtils {
	private static $appID = 'wxe956bbe31cf91d57';
	private static $appSecret = 'f3f4bcd565cac3e2907e640c8b912316';

	public function __construct($app_id, $app_secret) {
		isset($app_id) && !empty($app_id) ? wxUtils::$appID = $app_id : '';
		isset($app_secret) && !empty($app_secret) ? wxUtils::$appSecret = $app_secret : '';
	}

	static function setSession($key, $value, $time) {
		session_start();
		//使用SESSION前必须调用该函数。
		$_SESSION[$key] = $value;
		//注册一个SESSION变量
		$_SESSION['time'] = $time || time();
	}

	static function arrayToXml($arr) {
		$xml = "<xml>";
		foreach ($arr as $key => $val) {
			if (is_numeric($val)) {
				$xml .= "<" . $key . ">" . $val . "</" . $key . ">";

			} else {
				$xml .= "<" . $key . "><![CDATA[" . $val . "]]></" . $key . ">";
			}
		}
		$xml .= "</xml>";
		return $xml;
	}

	/**
	 * @description 获取accesstoken值
	 */
	public static function get_access_token() {
		$access_token = Utils::get_session('k_weixin_access_token');

		if ($access_token) {
			//已缓存，直接使用
			return $access_token;
		} else {
			//获取access_token
			$app_id = wxUtils::$appID;
			$app_secret = wxUtils::$appSecret;
			$get_access_token_url = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid={$app_id}&secret={$app_secret}";
			$jo = json_decode(Utils::curl_post($get_access_token_url, null));
			// 缓存数据7200秒
			Utils::set_session('k_weixin_access_token', $jo -> access_token, 7200);
			return $jo -> access_token;
		}
	}

	public static function get_access_token_session() {
		return '从session中获取值为:'.Utils::get_session('k_weixin_access_token');
	}

	/**
	 * @description 获取jsapiticket
	 * @param {$access_token} 密钥串
	 */
	public static function get_jsapi_ticket($access_token) {
		$jsapi_ticket = Utils::get_session('k_weixin_jsapi_ticket');

		if ($jsapi_ticket) {
			//已缓存，直接使用
			return $jsapi_ticket;
		} else {
			//获取access_token
			$get_jsapi_ticket_url = "https://api.weixin.qq.com/cgi-bin/ticket/getticket?access_token={$access_token}&type=jsapi";
			$jo = json_decode(Utils::curl_post($get_jsapi_ticket_url, null));
			// 缓存数据7200秒
			Utils::set_session('k_weixin_jsapi_ticket', $jo -> ticket, 7200);
			return $jo -> ticket;
		}
	}

	/**
	 * @description 使用加密算法获取signature
	 * 注意事项:
	 * 	1、签名用的noncestr和timestamp必须与wx.config中的nonceStr和timestamp相同。
	 *	2、签名用的url必须是调用JS接口页面的完整URL。
	 *	3、出于安全考虑，开发者必须在服务器端实现签名的逻辑。
	 */
	public static function get_signature() {

		/**
		 * @description 说明
		 * 	1、access_token每日只有2000次调用，因此也需要缓存,有效期为两个小时
		 * 	2、access_token用于获取jsapi_ticket，公众号用于调用微信JS接口的临时票据。正常情况下，jsapi_ticket的有效期为7200秒，需要进行缓存
		 * 	3、参与签名的字段包括noncestr（随机字符串）, 有效的jsapi_ticket, timestamp（时间戳）, url（当前网页的URL，不包含#及其后面部分） 。
		 * 	4、对所有待签名参数按照字段名的ASCII 码从小到大排序（字典序）后，使用URL键值对的格式（即key1=value1&key2=value2…）拼接成字符串string1。
		 * 	5、这里需要注意的是所有参数名均为小写字符。对string1作sha1加密，字段名和字段值都采用原始值，不进行URL 转义。
		 * 	6、noncestr=random_str	jsapi_ticket=get_jsapi_ticket	timestamp=time()
		 * 	7、url='http://'.$_SERVER['SERVER_NAME'].':'.$_SERVER["SERVER_PORT"].$_SERVER["REQUEST_URI"],如：http://mp.weixin.qq.com?params=value
		 * 	8、sha1签名：sha1($str)
		 * 	9、待签名字符串(注意字符串顺序)：jsapi_ticket={$jsapi_ticket}&noncestr={$noncestr}&timestamp={$timestamp}&url={$url}
		 */

		$access_token = Utils::get_session('k_weixin_access_token');
		$jsapi_ticket = Utils::get_session('k_weixin_jsapi_ticket');
		//access_token不存在先获取
		if (!$access_token) {
			$access_token = wxUtils::get_access_token();
		}
		//jsapi_ticket不存在先获取
		if (!$jsapi_ticket) {
			$jsapi_ticket = wxUtils::get_jsapi_ticket($access_token);
		}
		$noncestr = Utils::random_str();
		$timestamp = time();
		$url = 'http://' . $_SERVER['SERVER_NAME'] . $_SERVER["REQUEST_URI"];
		$signatureStr = "jsapi_ticket={$jsapi_ticket}&noncestr={$noncestr}&timestamp={$timestamp}&url={$url}";
		//print_r($signatureStr);
		return array('app_id' => wxUtils::$appID, 'jsapi_ticket' => $jsapi_ticket, 'url' => $url, 'noncestr' => $noncestr, 'timestamp' => $timestamp, 'signature' => sha1($signatureStr));
	}

}
?>